package org.example.scoresystem_backen.util;

import org.example.scoresystem_backen.dto.PageRequest;
import org.example.scoresystem_backen.dto.PageResponse;

import java.util.List;

/**
 * 分页工具类
 * 提供分页计算的通用方法
 */
public class PageUtil {

    /**
     * 默认页码
     */
    public static final int DEFAULT_PAGE = 1;

    /**
     * 默认每页条数
     */
    public static final int DEFAULT_PAGE_SIZE = 10;

    /**
     * 最大每页条数
     */
    public static final int MAX_PAGE_SIZE = 100;

    /**
     * 验证并修正分页参数
     * @param page 页码
     * @param pageSize 每页条数
     * @return 修正后的分页请求对象
     */
    public static PageRequest validatePageParams(Integer page, Integer pageSize) {
        PageRequest pageRequest = new PageRequest();
        pageRequest.setPage(page);
        pageRequest.setPageSize(pageSize);
        pageRequest.validate();
        return pageRequest;
    }

    /**
     * 计算总页数
     * @param totalCount 总记录数
     * @param pageSize 每页条数
     * @return 总页数
     */
    public static int calculateTotalPages(long totalCount, int pageSize) {
        if (totalCount <= 0 || pageSize <= 0) {
            return 0;
        }
        return (int) Math.ceil((double) totalCount / pageSize);
    }

    /**
     * 计算偏移量
     * @param page 页码（从1开始）
     * @param pageSize 每页条数
     * @return 偏移量
     */
    public static int calculateOffset(int page, int pageSize) {
        if (page < 1) {
            page = 1;
        }
        return (page - 1) * pageSize;
    }

    /**
     * 判断是否有上一页
     * @param currentPage 当前页码
     * @return 是否有上一页
     */
    public static boolean hasPreviousPage(int currentPage) {
        return currentPage > 1;
    }

    /**
     * 判断是否有下一页
     * @param currentPage 当前页码
     * @param totalPages 总页数
     * @return 是否有下一页
     */
    public static boolean hasNextPage(int currentPage, int totalPages) {
        return currentPage < totalPages;
    }

    /**
     * 创建分页响应对象
     * @param pageRequest 分页请求
     * @param totalCount 总记录数
     * @param data 数据列表
     * @param <T> 数据类型
     * @return 分页响应对象
     */
    public static <T> PageResponse<T> createPageResponse(PageRequest pageRequest, Long totalCount, List<T> data) {
        return PageResponse.of(pageRequest, totalCount, data);
    }

    /**
     * 创建空的分页响应对象
     * @param pageRequest 分页请求
     * @param <T> 数据类型
     * @return 空的分页响应对象
     */
    public static <T> PageResponse<T> createEmptyPageResponse(PageRequest pageRequest) {
        return PageResponse.empty(pageRequest);
    }

    /**
     * 验证页码范围
     * @param page 页码
     * @param totalPages 总页数
     * @return 是否在有效范围内
     */
    public static boolean isValidPageRange(int page, int totalPages) {
        return page >= 1 && (totalPages == 0 || page <= totalPages);
    }

    /**
     * 获取安全的页码（确保在有效范围内）
     * @param page 页码
     * @param totalPages 总页数
     * @return 安全的页码
     */
    public static int getSafePage(int page, int totalPages) {
        if (page < 1) {
            return 1;
        }
        if (totalPages > 0 && page > totalPages) {
            return totalPages;
        }
        return page;
    }
}
